package io.adminboot.system.aspect;

import com.google.gson.Gson;
import io.adminboot.entity.SysLog;
import io.adminboot.entity.SysUser;
import io.adminboot.exception.MyException;
import io.adminboot.service.SysLogService;
import io.adminboot.system.annotation.AddSysLog;
import io.adminboot.utils.HttpContextUtils;
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.Date;


/**
 * 系统日志，切面处理类
 */
@Aspect
@Component
public class SysLogAspect {
    @Autowired
    private SysLogService sysLogService;

    @Pointcut("@annotation(io.adminboot.system.annotation.AddSysLog)")
    public void logPointCut() {

    }

    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        //执行方法
        Object result = point.proceed();
        //执行时长(毫秒)
        long time = System.currentTimeMillis() - beginTime;

        //保存日志
        saveSysLog(point, time);

        return result;
    }

    private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        SysLog entity = new SysLog();

        //用户名
        SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();
        if (user == null) {
            throw new MyException("获取登陆用户失败");
        }
        String username = user.getUsername();
        entity.setUsername(username);

        AddSysLog syslogAnnotation = method.getAnnotation(AddSysLog.class);
        if (syslogAnnotation != null) {
            //注解上的描述
            entity.setOperation(syslogAnnotation.value());
        }

        //请求的方法名
        String className = joinPoint.getTarget().getClass().getName();
        String methodName = signature.getName();
        entity.setMethod(className + "." + methodName + "()");

        //请求的参数
        Object[] args = joinPoint.getArgs();
        try {
            String params = new Gson().toJson(args[0]);
            entity.setParams(params);
        } catch (Exception e) {

        }

        //设置IP地址
        entity.setIp(HttpContextUtils.getIpAddr());

        entity.setTime(time);
        entity.setCreateDate(new Date());
        //保存系统日志
        sysLogService.insert(entity);
    }
}
